<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>template | Teng&#39;s blog</title>
    <meta name="generator" content="VuePress 1.9.7">
    <link rel="icon" href="/logo/favicon.ico">
    <meta name="description" content="">
    <meta name="keywords" content="大数据,java,h5,前端,人工智能,深度学习,go">
    <meta name="theme-color" content="#3eaf7c">
    
    <link rel="preload" href="/assets/css/0.styles.c17b3ac5.css" as="style"><link rel="preload" href="/assets/js/app.ab6a7ec7.js" as="script"><link rel="preload" href="/assets/js/2.bc9beebf.js" as="script"><link rel="preload" href="/assets/js/289.83413eb3.js" as="script"><link rel="prefetch" href="/assets/js/10.829fbe09.js"><link rel="prefetch" href="/assets/js/100.21819a92.js"><link rel="prefetch" href="/assets/js/101.cba9a2fb.js"><link rel="prefetch" href="/assets/js/102.866a5b15.js"><link rel="prefetch" href="/assets/js/103.fdb7598a.js"><link rel="prefetch" href="/assets/js/104.75b80350.js"><link rel="prefetch" href="/assets/js/105.3030b5b8.js"><link rel="prefetch" href="/assets/js/106.11a5a8f2.js"><link rel="prefetch" href="/assets/js/107.232bdd92.js"><link rel="prefetch" href="/assets/js/108.a619d3d9.js"><link rel="prefetch" href="/assets/js/109.d31480d9.js"><link rel="prefetch" href="/assets/js/11.18a3d2d0.js"><link rel="prefetch" href="/assets/js/110.7b7051ad.js"><link rel="prefetch" href="/assets/js/111.6976153b.js"><link rel="prefetch" href="/assets/js/112.935a63bd.js"><link rel="prefetch" href="/assets/js/113.77296509.js"><link rel="prefetch" href="/assets/js/114.3ab3be4a.js"><link rel="prefetch" href="/assets/js/115.9b0dac10.js"><link rel="prefetch" href="/assets/js/116.55bc2cd6.js"><link rel="prefetch" href="/assets/js/117.75bd6d05.js"><link rel="prefetch" href="/assets/js/118.0dae142d.js"><link rel="prefetch" href="/assets/js/119.b1a2888c.js"><link rel="prefetch" href="/assets/js/12.81e292a4.js"><link rel="prefetch" href="/assets/js/120.6a3fd99f.js"><link rel="prefetch" href="/assets/js/121.ea1e1714.js"><link rel="prefetch" href="/assets/js/122.125ebe03.js"><link rel="prefetch" href="/assets/js/123.ec5bcef7.js"><link rel="prefetch" href="/assets/js/124.f346a2dc.js"><link rel="prefetch" href="/assets/js/125.11061d5a.js"><link rel="prefetch" href="/assets/js/126.7f8bc26b.js"><link rel="prefetch" href="/assets/js/127.26df99b6.js"><link rel="prefetch" href="/assets/js/128.0d4aae4f.js"><link rel="prefetch" href="/assets/js/129.ec01b50e.js"><link rel="prefetch" href="/assets/js/13.89c37359.js"><link rel="prefetch" href="/assets/js/130.9e570618.js"><link rel="prefetch" href="/assets/js/131.ffaed293.js"><link rel="prefetch" href="/assets/js/132.6ef77a2c.js"><link rel="prefetch" href="/assets/js/133.893078b6.js"><link rel="prefetch" href="/assets/js/134.a5229ebf.js"><link rel="prefetch" href="/assets/js/135.e1015261.js"><link rel="prefetch" href="/assets/js/136.655ac222.js"><link rel="prefetch" href="/assets/js/137.4c18a7dc.js"><link rel="prefetch" href="/assets/js/138.17cf92aa.js"><link rel="prefetch" href="/assets/js/139.7e23a82f.js"><link rel="prefetch" href="/assets/js/14.5a11397f.js"><link rel="prefetch" href="/assets/js/140.570f33f7.js"><link rel="prefetch" href="/assets/js/141.eb538cc8.js"><link rel="prefetch" href="/assets/js/142.2f38d42f.js"><link rel="prefetch" href="/assets/js/143.a32de735.js"><link rel="prefetch" href="/assets/js/144.76a63ee6.js"><link rel="prefetch" href="/assets/js/145.42483d13.js"><link rel="prefetch" href="/assets/js/146.068119e8.js"><link rel="prefetch" href="/assets/js/147.64de6f65.js"><link rel="prefetch" href="/assets/js/148.5709a561.js"><link rel="prefetch" href="/assets/js/149.9373f1d3.js"><link rel="prefetch" href="/assets/js/15.f98080cd.js"><link rel="prefetch" href="/assets/js/150.85328596.js"><link rel="prefetch" href="/assets/js/151.8179d926.js"><link rel="prefetch" href="/assets/js/152.357ef7ac.js"><link rel="prefetch" href="/assets/js/153.a7f37700.js"><link rel="prefetch" href="/assets/js/154.259e0731.js"><link rel="prefetch" href="/assets/js/155.609478f3.js"><link rel="prefetch" href="/assets/js/156.c02413b4.js"><link rel="prefetch" href="/assets/js/157.4225246d.js"><link rel="prefetch" href="/assets/js/158.90aa3193.js"><link rel="prefetch" href="/assets/js/159.48a36d7f.js"><link rel="prefetch" href="/assets/js/16.c2c39a12.js"><link rel="prefetch" href="/assets/js/160.1483c525.js"><link rel="prefetch" href="/assets/js/161.935da955.js"><link rel="prefetch" href="/assets/js/162.623fec51.js"><link rel="prefetch" href="/assets/js/163.9b588340.js"><link rel="prefetch" href="/assets/js/164.30ec5aba.js"><link rel="prefetch" href="/assets/js/165.189a8317.js"><link rel="prefetch" href="/assets/js/166.5af6c2ec.js"><link rel="prefetch" href="/assets/js/167.9dff1ac7.js"><link rel="prefetch" href="/assets/js/168.622f7001.js"><link rel="prefetch" href="/assets/js/169.2e7169b6.js"><link rel="prefetch" href="/assets/js/17.b69c805b.js"><link rel="prefetch" href="/assets/js/170.722cbe91.js"><link rel="prefetch" href="/assets/js/171.bc79c387.js"><link rel="prefetch" href="/assets/js/172.ee6817b8.js"><link rel="prefetch" href="/assets/js/173.b35d740e.js"><link rel="prefetch" href="/assets/js/174.5c6e7df5.js"><link rel="prefetch" href="/assets/js/175.d4a5903b.js"><link rel="prefetch" href="/assets/js/176.7be8b3ab.js"><link rel="prefetch" href="/assets/js/177.21a314f9.js"><link rel="prefetch" href="/assets/js/178.7c287ca3.js"><link rel="prefetch" href="/assets/js/179.b4682242.js"><link rel="prefetch" href="/assets/js/18.8b504010.js"><link rel="prefetch" href="/assets/js/180.0098b166.js"><link rel="prefetch" href="/assets/js/181.1ade00c6.js"><link rel="prefetch" href="/assets/js/182.2cdebd59.js"><link rel="prefetch" href="/assets/js/183.019718a7.js"><link rel="prefetch" href="/assets/js/184.d4ab9703.js"><link rel="prefetch" href="/assets/js/185.50d60e28.js"><link rel="prefetch" href="/assets/js/186.3a98e144.js"><link rel="prefetch" href="/assets/js/187.9ed4524b.js"><link rel="prefetch" href="/assets/js/188.c3a8a353.js"><link rel="prefetch" href="/assets/js/189.b949cdaa.js"><link rel="prefetch" href="/assets/js/19.6860ea74.js"><link rel="prefetch" href="/assets/js/190.7a54fb5e.js"><link rel="prefetch" href="/assets/js/191.804d06a5.js"><link rel="prefetch" href="/assets/js/192.c729ba9b.js"><link rel="prefetch" href="/assets/js/193.e8d492ad.js"><link rel="prefetch" href="/assets/js/194.49b4668e.js"><link rel="prefetch" href="/assets/js/195.e4508c24.js"><link rel="prefetch" href="/assets/js/196.538420c6.js"><link rel="prefetch" href="/assets/js/197.56fda656.js"><link rel="prefetch" href="/assets/js/198.75e420ad.js"><link rel="prefetch" href="/assets/js/199.67784aef.js"><link rel="prefetch" href="/assets/js/20.82f2e898.js"><link rel="prefetch" href="/assets/js/200.b32cd750.js"><link rel="prefetch" href="/assets/js/201.594db75b.js"><link rel="prefetch" href="/assets/js/202.70b380ec.js"><link rel="prefetch" href="/assets/js/203.0de30338.js"><link rel="prefetch" href="/assets/js/204.360c28c7.js"><link rel="prefetch" href="/assets/js/205.5b4b553b.js"><link rel="prefetch" href="/assets/js/206.6bd13fc8.js"><link rel="prefetch" href="/assets/js/207.875be01b.js"><link rel="prefetch" href="/assets/js/208.00694e2b.js"><link rel="prefetch" href="/assets/js/209.1fa15603.js"><link rel="prefetch" href="/assets/js/21.3f050c1d.js"><link rel="prefetch" href="/assets/js/210.f11e4fe3.js"><link rel="prefetch" href="/assets/js/211.a9beca8a.js"><link rel="prefetch" href="/assets/js/212.2fb3a3b1.js"><link rel="prefetch" href="/assets/js/213.c2fb7dcf.js"><link rel="prefetch" href="/assets/js/214.7613f2f7.js"><link rel="prefetch" href="/assets/js/215.ac00cd4b.js"><link rel="prefetch" href="/assets/js/216.926eb535.js"><link rel="prefetch" href="/assets/js/217.e03af99a.js"><link rel="prefetch" href="/assets/js/218.0212a1a9.js"><link rel="prefetch" href="/assets/js/219.318a1817.js"><link rel="prefetch" href="/assets/js/22.f2a18e55.js"><link rel="prefetch" href="/assets/js/220.34f368ec.js"><link rel="prefetch" href="/assets/js/221.1d325330.js"><link rel="prefetch" href="/assets/js/222.f8ac9e1e.js"><link rel="prefetch" href="/assets/js/223.1d081b10.js"><link rel="prefetch" href="/assets/js/224.d4a3c833.js"><link rel="prefetch" href="/assets/js/225.86046773.js"><link rel="prefetch" href="/assets/js/226.ee01e5ed.js"><link rel="prefetch" href="/assets/js/227.cc700349.js"><link rel="prefetch" href="/assets/js/228.121d2708.js"><link rel="prefetch" href="/assets/js/229.411a1a59.js"><link rel="prefetch" href="/assets/js/23.8416a606.js"><link rel="prefetch" href="/assets/js/230.ce1cd57d.js"><link rel="prefetch" href="/assets/js/231.9e415c00.js"><link rel="prefetch" href="/assets/js/232.af1434b0.js"><link rel="prefetch" href="/assets/js/233.aedf0a69.js"><link rel="prefetch" href="/assets/js/234.7343179f.js"><link rel="prefetch" href="/assets/js/235.3ea94188.js"><link rel="prefetch" href="/assets/js/236.e632719a.js"><link rel="prefetch" href="/assets/js/237.34a70a59.js"><link rel="prefetch" href="/assets/js/238.9582b4be.js"><link rel="prefetch" href="/assets/js/239.2a1f2f8d.js"><link rel="prefetch" href="/assets/js/24.73629fb4.js"><link rel="prefetch" href="/assets/js/240.e0563eb9.js"><link rel="prefetch" href="/assets/js/241.7a2b4d6e.js"><link rel="prefetch" href="/assets/js/242.f9f59053.js"><link rel="prefetch" href="/assets/js/243.95904034.js"><link rel="prefetch" href="/assets/js/244.0c91ecaa.js"><link rel="prefetch" href="/assets/js/245.58988353.js"><link rel="prefetch" href="/assets/js/246.73360878.js"><link rel="prefetch" href="/assets/js/247.3f36cb13.js"><link rel="prefetch" href="/assets/js/248.9bca99ac.js"><link rel="prefetch" href="/assets/js/249.e78a3dbb.js"><link rel="prefetch" href="/assets/js/25.f62ba06b.js"><link rel="prefetch" href="/assets/js/250.5999a7b3.js"><link rel="prefetch" href="/assets/js/251.5204362e.js"><link rel="prefetch" href="/assets/js/252.a731f0e2.js"><link rel="prefetch" href="/assets/js/253.ef15afff.js"><link rel="prefetch" href="/assets/js/254.8e0d8aa8.js"><link rel="prefetch" href="/assets/js/255.53408731.js"><link rel="prefetch" href="/assets/js/256.3d08ae8f.js"><link rel="prefetch" href="/assets/js/257.1de6306c.js"><link rel="prefetch" href="/assets/js/258.b3ec2e6c.js"><link rel="prefetch" href="/assets/js/259.40e6c088.js"><link rel="prefetch" href="/assets/js/26.ed3d7d52.js"><link rel="prefetch" href="/assets/js/260.05ea317d.js"><link rel="prefetch" href="/assets/js/261.048af235.js"><link rel="prefetch" href="/assets/js/262.905ce2e2.js"><link rel="prefetch" href="/assets/js/263.8ace396b.js"><link rel="prefetch" href="/assets/js/264.10841fe2.js"><link rel="prefetch" href="/assets/js/265.f94f5548.js"><link rel="prefetch" href="/assets/js/266.bf7b6e06.js"><link rel="prefetch" href="/assets/js/267.4c03cbf4.js"><link rel="prefetch" href="/assets/js/268.1886e607.js"><link rel="prefetch" href="/assets/js/269.9dfca98b.js"><link rel="prefetch" href="/assets/js/27.18a2fe1c.js"><link rel="prefetch" href="/assets/js/270.a0ebdd62.js"><link rel="prefetch" href="/assets/js/271.cb9ce68b.js"><link rel="prefetch" href="/assets/js/272.99ea7c05.js"><link rel="prefetch" href="/assets/js/273.7f5c9d16.js"><link rel="prefetch" href="/assets/js/274.1ca50474.js"><link rel="prefetch" href="/assets/js/275.e0a79a93.js"><link rel="prefetch" href="/assets/js/276.5e9f441d.js"><link rel="prefetch" href="/assets/js/277.31f82a4b.js"><link rel="prefetch" href="/assets/js/278.2df5557a.js"><link rel="prefetch" href="/assets/js/279.6caef400.js"><link rel="prefetch" href="/assets/js/28.30687ae2.js"><link rel="prefetch" href="/assets/js/280.07da039a.js"><link rel="prefetch" href="/assets/js/281.81b66752.js"><link rel="prefetch" href="/assets/js/282.a362880b.js"><link rel="prefetch" href="/assets/js/283.37de8db2.js"><link rel="prefetch" href="/assets/js/284.31a9bcd5.js"><link rel="prefetch" href="/assets/js/285.e1ed9d70.js"><link rel="prefetch" href="/assets/js/286.5cd73851.js"><link rel="prefetch" href="/assets/js/287.b598b99a.js"><link rel="prefetch" href="/assets/js/288.a2580005.js"><link rel="prefetch" href="/assets/js/29.8f48fd0e.js"><link rel="prefetch" href="/assets/js/290.405974a0.js"><link rel="prefetch" href="/assets/js/291.f762f6f9.js"><link rel="prefetch" href="/assets/js/292.f5851afc.js"><link rel="prefetch" href="/assets/js/293.8e7d9ffa.js"><link rel="prefetch" href="/assets/js/294.3694f780.js"><link rel="prefetch" href="/assets/js/295.84d9cd4c.js"><link rel="prefetch" href="/assets/js/296.0a6bbe5d.js"><link rel="prefetch" href="/assets/js/297.195f8ede.js"><link rel="prefetch" href="/assets/js/3.7494bd83.js"><link rel="prefetch" href="/assets/js/30.5f000d59.js"><link rel="prefetch" href="/assets/js/31.2f3aea00.js"><link rel="prefetch" href="/assets/js/32.78912726.js"><link rel="prefetch" href="/assets/js/33.4f600444.js"><link rel="prefetch" href="/assets/js/34.1ec8259c.js"><link rel="prefetch" href="/assets/js/35.bc414639.js"><link rel="prefetch" href="/assets/js/36.b0c05f62.js"><link rel="prefetch" href="/assets/js/37.7e626d70.js"><link rel="prefetch" href="/assets/js/38.bb3a6a22.js"><link rel="prefetch" href="/assets/js/39.3d17059f.js"><link rel="prefetch" href="/assets/js/4.ff6020d1.js"><link rel="prefetch" href="/assets/js/40.2023aaeb.js"><link rel="prefetch" href="/assets/js/41.64452f22.js"><link rel="prefetch" href="/assets/js/42.32522c9c.js"><link rel="prefetch" href="/assets/js/43.ae24bdff.js"><link rel="prefetch" href="/assets/js/44.3acc6c82.js"><link rel="prefetch" href="/assets/js/45.2cec263d.js"><link rel="prefetch" href="/assets/js/46.ceacfcd8.js"><link rel="prefetch" href="/assets/js/47.59030139.js"><link rel="prefetch" href="/assets/js/48.fa5e3c59.js"><link rel="prefetch" href="/assets/js/49.2054398b.js"><link rel="prefetch" href="/assets/js/5.f2ade644.js"><link rel="prefetch" href="/assets/js/50.47a76469.js"><link rel="prefetch" href="/assets/js/51.c36ce30b.js"><link rel="prefetch" href="/assets/js/52.72ce6650.js"><link rel="prefetch" href="/assets/js/53.9dbe65dd.js"><link rel="prefetch" href="/assets/js/54.b571c195.js"><link rel="prefetch" href="/assets/js/55.3502ffd5.js"><link rel="prefetch" href="/assets/js/56.790119c4.js"><link rel="prefetch" href="/assets/js/57.aae4081b.js"><link rel="prefetch" href="/assets/js/58.e54d1920.js"><link rel="prefetch" href="/assets/js/59.6eaa8c48.js"><link rel="prefetch" href="/assets/js/6.04d544f0.js"><link rel="prefetch" href="/assets/js/60.7b2d3e47.js"><link rel="prefetch" href="/assets/js/61.093542b8.js"><link rel="prefetch" href="/assets/js/62.d0af83fd.js"><link rel="prefetch" href="/assets/js/63.b57f13fb.js"><link rel="prefetch" href="/assets/js/64.acbb2295.js"><link rel="prefetch" href="/assets/js/65.87d05864.js"><link rel="prefetch" href="/assets/js/66.773a0404.js"><link rel="prefetch" href="/assets/js/67.c66984d0.js"><link rel="prefetch" href="/assets/js/68.77bfcb54.js"><link rel="prefetch" href="/assets/js/69.7e3d1cc4.js"><link rel="prefetch" href="/assets/js/7.bc46b052.js"><link rel="prefetch" href="/assets/js/70.dbd5eb9b.js"><link rel="prefetch" href="/assets/js/71.109923c3.js"><link rel="prefetch" href="/assets/js/72.c92d7f25.js"><link rel="prefetch" href="/assets/js/73.a8ef2055.js"><link rel="prefetch" href="/assets/js/74.79119a72.js"><link rel="prefetch" href="/assets/js/75.009bcb5e.js"><link rel="prefetch" href="/assets/js/76.cba94ffd.js"><link rel="prefetch" href="/assets/js/77.caa07e47.js"><link rel="prefetch" href="/assets/js/78.fef64e9e.js"><link rel="prefetch" href="/assets/js/79.72d6eb81.js"><link rel="prefetch" href="/assets/js/8.8cf6541b.js"><link rel="prefetch" href="/assets/js/80.9370a1bd.js"><link rel="prefetch" href="/assets/js/81.f53b6c0a.js"><link rel="prefetch" href="/assets/js/82.01861305.js"><link rel="prefetch" href="/assets/js/83.4d69c6c5.js"><link rel="prefetch" href="/assets/js/84.ea80ae96.js"><link rel="prefetch" href="/assets/js/85.34c10294.js"><link rel="prefetch" href="/assets/js/86.4c7d6d58.js"><link rel="prefetch" href="/assets/js/87.ade6c1ee.js"><link rel="prefetch" href="/assets/js/88.306bb690.js"><link rel="prefetch" href="/assets/js/89.ed02954c.js"><link rel="prefetch" href="/assets/js/9.b3d99320.js"><link rel="prefetch" href="/assets/js/90.8db20502.js"><link rel="prefetch" href="/assets/js/91.3d01b6a4.js"><link rel="prefetch" href="/assets/js/92.b3dcea87.js"><link rel="prefetch" href="/assets/js/93.28790aa5.js"><link rel="prefetch" href="/assets/js/94.45722d7d.js"><link rel="prefetch" href="/assets/js/95.c04b6585.js"><link rel="prefetch" href="/assets/js/96.7c4d9328.js"><link rel="prefetch" href="/assets/js/97.85bb6089.js"><link rel="prefetch" href="/assets/js/98.e22a9c08.js"><link rel="prefetch" href="/assets/js/99.fd9f1f1d.js">
    <link rel="stylesheet" href="/assets/css/0.styles.c17b3ac5.css">
  </head>
  <body class="theme-mode-light">
    <div id="app" data-server-rendered="true"><div class="theme-container sidebar-open have-rightmenu"><header class="navbar blur"><div title="目录" class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><img src="/logo/TB-mini.png" alt="Teng's blog" class="logo"> <span class="site-name can-hide">Teng's blog</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><a href="/note/java/" class="nav-link">Java</a></div><div class="nav-item"><a href="/note/font-end/" class="nav-link">H5前端</a></div> <a href="https://github.com/shetengteng" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar-hover-trigger"></div> <aside class="sidebar" style="display:none;"><!----> <nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">首页</a></div><div class="nav-item"><a href="/note/java/" class="nav-link">Java</a></div><div class="nav-item"><a href="/note/font-end/" class="nav-link">H5前端</a></div> <a href="https://github.com/shetengteng" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <span><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg> <span class="sr-only">(opens new window)</span></span></a></nav>  <ul class="sidebar-links"><li><a href="/pages/c29ae4/" class="sidebar-link">背景介绍</a></li><li><a href="/pages/b38488/" class="sidebar-link">安装</a></li><li><a href="/pages/388924/" class="sidebar-link">配置说明</a></li><li><a href="/pages/ff1ac4/" class="sidebar-link">基础命令</a></li><li><a href="/pages/2c8a0a/" class="sidebar-link">常用模块</a></li><li><section class="sidebar-group collapsable depth-0"><p class="sidebar-heading open"><span>Playbook</span> <span class="arrow down"></span></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/pages/eb387a/" class="sidebar-link">简单介绍</a></li><li><a href="/pages/3bceaf/" class="sidebar-link">yaml语法</a></li><li><a href="/pages/bfb650/" class="sidebar-link">hosts</a></li><li><a href="/pages/5c578f/" class="sidebar-link">task</a></li><li><a href="/pages/1f8df5/" class="sidebar-link">运行playbook</a></li><li><a href="/pages/ab6096/" class="sidebar-link">handlers</a></li><li><a href="/pages/c660f6/" class="sidebar-link">tags</a></li><li><a href="/pages/a2e5ec/" class="sidebar-link">variables</a></li><li><a href="/pages/f123e9/" aria-current="page" class="active sidebar-link">template</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/pages/f123e9/#概念介绍" class="sidebar-link">概念介绍</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#template模块介绍" class="sidebar-link">template模块介绍</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#应用实例-安装nginx" class="sidebar-link">应用实例：安装nginx</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/pages/f123e9/#获取nginx配置" class="sidebar-link">获取nginx配置</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#创建templates文件夹" class="sidebar-link">创建templates文件夹</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#编辑执行的yml文件" class="sidebar-link">编辑执行的yml文件</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#执行安装" class="sidebar-link">执行安装</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#检查安装结果" class="sidebar-link">检查安装结果</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#新需求-nginx-work进程是服务器内核数的一半" class="sidebar-link">新需求：nginx work进程是服务器内核数的一半</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#新需求-使用自定义变量设置端口号" class="sidebar-link">新需求：使用自定义变量设置端口号</a></li></ul></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#template中使用for" class="sidebar-link">template中使用for</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/pages/f123e9/#键值对" class="sidebar-link">键值对</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#列表" class="sidebar-link">列表</a></li></ul></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#template中使用if" class="sidebar-link">template中使用if</a></li><li class="sidebar-sub-header"><a href="/pages/f123e9/#应用实例-使用for与if" class="sidebar-link">应用实例：使用for与if</a></li></ul></li><li><a href="/pages/f12b8f/" class="sidebar-link">when条件判断</a></li><li><a href="/pages/fecbf2/" class="sidebar-link">with_items迭代</a></li><li><a href="/pages/d1d3a1/" class="sidebar-link">roles</a></li><li><a href="/pages/3854bb/" class="sidebar-link">附：jinja2语法</a></li></ul></section></li></ul> </aside> <div><main class="page"><div class="theme-vdoing-wrapper "><div class="articleInfo-wrap" data-v-0c557b5e><div class="articleInfo" data-v-0c557b5e><ul class="breadcrumbs" data-v-0c557b5e><li data-v-0c557b5e><a href="/" title="首页" class="iconfont icon-home router-link-active" data-v-0c557b5e></a></li> <li data-v-0c557b5e><a href="/note/ansible/#Tool-Ansible" data-v-0c557b5e>Tool-Ansible</a></li><li data-v-0c557b5e><a href="/note/ansible/#Playbook" data-v-0c557b5e>Playbook</a></li></ul> <div class="info" data-v-0c557b5e><div title="作者" class="author iconfont icon-touxiang" data-v-0c557b5e><a href="https://github.com/shetengteng" target="_blank" title="作者" class="beLink" data-v-0c557b5e>Shetengteng</a></div> <div title="创建时间" class="date iconfont icon-riqi" data-v-0c557b5e><a href="javascript:;" data-v-0c557b5e>2022-05-13</a></div> <!----></div></div></div> <!----> <div class="content-wrapper"><div class="right-menu-wrapper"><div class="right-menu-margin"><div class="right-menu-content"></div></div></div> <h1><!---->template<!----></h1>  <div class="theme-vdoing-content content__default"><h2 id="概念介绍"><a href="#概念介绍" class="header-anchor">#</a> 概念介绍</h2> <ul><li><p>一种文本文件</p></li> <li><p>嵌套有脚本（使用模板编程语言编写） 借助模板生成真正的文件</p></li> <li><p>通过替换模板文件中的变量，生成不同的文件，实现一些简单的逻辑</p></li> <li><p>使用场景：针对不同的服务器，使用不同参数的配置文件，需要建立一个文件的模板，对不同的服务变化不同的参数</p></li> <li><p><strong>使用Jinja2语言语法</strong></p> <ul><li>定义字面量，有如下形式
<ul><li>字符串：使用单引号或双引号</li> <li>数字：整数，浮点数</li> <li>列表：[item1, item2, ...]</li> <li>元组：(item1, item2, ...)</li> <li>字典：{key1:value1, key2:value2, ...}</li> <li>布尔型：true/false</li></ul></li> <li>算术运算：+, -, *, / 有小数点, // 整除 , % 取得余, ** 次方</li> <li>比较操作：==, !=, &gt;, &gt;=, &lt;, &lt;=</li> <li>逻辑运算：and，or，not</li> <li>流表达式：For，If，When</li></ul></li> <li><p>使用ansible的template模块实现模板功能</p></li></ul> <h2 id="template模块介绍"><a href="#template模块介绍" class="header-anchor">#</a> template模块介绍</h2> <blockquote><p>根据模块文件动态生成对应的配置文件
注意：只能用于ansible-playbook命令，不能用于ansible命令</p></blockquote> <p>查看说明</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible-doc -s template
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>使用说明</p> <ul><li>template文件必须存放于templates目录下，且命名为 .j2 结尾</li> <li>yaml/yml 文件需和templates目录平级，目录结构如下</li></ul> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>./
├── my-playbook.yml
└── templates
  └── xx.j2
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><h2 id="应用实例-安装nginx"><a href="#应用实例-安装nginx" class="header-anchor">#</a> 应用实例：安装nginx</h2> <p>使用创建nginx服务，示例templates的使用，不同的服务器使用不同的nginx配置</p> <h3 id="获取nginx配置"><a href="#获取nginx配置" class="header-anchor">#</a> 获取nginx配置</h3> <p>先在一台机器上安装nginx服务，然后查看配置文件</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>yum -y <span class="token function">install</span> nginx
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>查看安装目录</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ~<span class="token punctuation">]</span><span class="token comment"># rpm -ql nginx</span>
/etc/logrotate.d/nginx
/etc/nginx/fastcgi.conf
/etc/nginx/fastcgi.conf.default
/etc/nginx/fastcgi_params
/etc/nginx/fastcgi_params.default
/etc/nginx/koi-utf
/etc/nginx/koi-win
<span class="token punctuation">..</span>.
/etc/nginx/nginx.conf
<span class="token punctuation">..</span>.
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><p>注意：安装nginx需要EPL源头</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>yum repolist <span class="token comment"># 查看是否有EPL源，给安装nginx做准备</span>
<span class="token comment"># 如果没有，则需要安装epel</span>
yum <span class="token function">install</span> -y epel-release
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>查看配置</p> <ul><li>注意worker_processes参数的配置，工作进程配置，auto是按照当前主机的内核个数配置工作进程数</li></ul> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ~<span class="token punctuation">]</span><span class="token comment"># cat /etc/nginx/nginx.conf</span>
<span class="token comment"># For more information on configuration, see:</span>
<span class="token comment">#   * Official English Documentation: http://nginx.org/en/docs/</span>
<span class="token comment">#   * Official Russian Documentation: http://nginx.org/ru/docs/</span>

user nginx<span class="token punctuation">;</span>
worker_processes auto<span class="token punctuation">;</span>
error_log /var/log/nginx/error.log<span class="token punctuation">;</span>
pid /run/nginx.pid<span class="token punctuation">;</span>

<span class="token comment"># Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.</span>
include /usr/share/nginx/modules/*.conf<span class="token punctuation">;</span>

events <span class="token punctuation">{</span>
    worker_connections <span class="token number">1024</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

http <span class="token punctuation">{</span>
    log_format  main  <span class="token string">'$remote_addr - $remote_user [$time_local] &quot;$request&quot; '</span>
                      <span class="token string">'$status $body_bytes_sent &quot;$http_referer&quot; '</span>
                      <span class="token string">'&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;'</span><span class="token punctuation">;</span>

    access_log  /var/log/nginx/access.log  main<span class="token punctuation">;</span>

    sendfile            on<span class="token punctuation">;</span>
    tcp_nopush          on<span class="token punctuation">;</span>
    tcp_nodelay         on<span class="token punctuation">;</span>
    keepalive_timeout   <span class="token number">65</span><span class="token punctuation">;</span>
    types_hash_max_size <span class="token number">4096</span><span class="token punctuation">;</span>

    include             /etc/nginx/mime.types<span class="token punctuation">;</span>
    default_type        application/octet-stream<span class="token punctuation">;</span>

    <span class="token comment"># Load modular configuration files from the /etc/nginx/conf.d directory.</span>
    <span class="token comment"># See http://nginx.org/en/docs/ngx_core_module.html#include</span>
    <span class="token comment"># for more information.</span>
    include /etc/nginx/conf.d/*.conf<span class="token punctuation">;</span>

    server <span class="token punctuation">{</span>
        listen       <span class="token number">80</span><span class="token punctuation">;</span>
        listen       <span class="token punctuation">[</span>::<span class="token punctuation">]</span>:80<span class="token punctuation">;</span>
        server_name  _<span class="token punctuation">;</span>
        root         /usr/share/nginx/html<span class="token punctuation">;</span>

        <span class="token comment"># Load configuration files for the default server block.</span>
        include /etc/nginx/default.d/*.conf<span class="token punctuation">;</span>

        error_page <span class="token number">404</span> /404.html<span class="token punctuation">;</span>
        location <span class="token operator">=</span> /404.html <span class="token punctuation">{</span>
        <span class="token punctuation">}</span>

        error_page <span class="token number">500</span> <span class="token number">502</span> <span class="token number">503</span> <span class="token number">504</span> /50x.html<span class="token punctuation">;</span>
        location <span class="token operator">=</span> /50x.html <span class="token punctuation">{</span>
        <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>

<span class="token comment"># Settings for a TLS enabled server.</span>
<span class="token comment">#</span>
<span class="token comment">#    server {</span>
<span class="token comment">#        listen       443 ssl http2;</span>
<span class="token comment">#        listen       [::]:443 ssl http2;</span>
<span class="token comment">#        server_name  _;</span>
<span class="token comment">#        root         /usr/share/nginx/html;</span>
<span class="token comment">#</span>
<span class="token comment">#        ssl_certificate &quot;/etc/pki/nginx/server.crt&quot;;</span>
<span class="token comment">#        ssl_certificate_key &quot;/etc/pki/nginx/private/server.key&quot;;</span>
<span class="token comment">#        ssl_session_cache shared:SSL:1m;</span>
<span class="token comment">#        ssl_session_timeout  10m;</span>
<span class="token comment">#        ssl_ciphers HIGH:!aNULL:!MD5;</span>
<span class="token comment">#        ssl_prefer_server_ciphers on;</span>
<span class="token comment">#</span>
<span class="token comment">#        # Load configuration files for the default server block.</span>
<span class="token comment">#        include /etc/nginx/default.d/*.conf;</span>
<span class="token comment">#</span>
<span class="token comment">#        error_page 404 /404.html;</span>
<span class="token comment">#            location = /40x.html {</span>
<span class="token comment">#        }</span>
<span class="token comment">#</span>
<span class="token comment">#        error_page 500 502 503 504 /50x.html;</span>
<span class="token comment">#            location = /50x.html {</span>
<span class="token comment">#        }</span>
<span class="token comment">#    }</span>

<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br></div></div><p>启动nginx服务</p> <ul><li>查看 master process 和 worker process 进程个数</li></ul> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ~<span class="token punctuation">]</span><span class="token comment"># systemctl start nginx</span>
<span class="token punctuation">[</span>root@linux101 ~<span class="token punctuation">]</span><span class="token comment"># ps aux | grep nginx</span>
root      <span class="token number">34236</span>  <span class="token number">0.0</span>  <span class="token number">0.0</span>  <span class="token number">39308</span>  <span class="token number">1052</span> ?        Ss   <span class="token number">10</span>:17   <span class="token number">0</span>:00 nginx: master process /usr/sbin/nginx
nginx     <span class="token number">34237</span>  <span class="token number">0.0</span>  <span class="token number">0.0</span>  <span class="token number">41780</span>  <span class="token number">1928</span> ?        S    <span class="token number">10</span>:17   <span class="token number">0</span>:00 nginx: worker process
nginx     <span class="token number">34238</span>  <span class="token number">0.0</span>  <span class="token number">0.0</span>  <span class="token number">41780</span>  <span class="token number">1940</span> ?        S    <span class="token number">10</span>:17   <span class="token number">0</span>:00 nginx: worker process
nginx     <span class="token number">34239</span>  <span class="token number">0.0</span>  <span class="token number">0.0</span>  <span class="token number">41780</span>  <span class="token number">1940</span> ?        S    <span class="token number">10</span>:17   <span class="token number">0</span>:00 nginx: worker process
<span class="token punctuation">..</span>.
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><h3 id="创建templates文件夹"><a href="#创建templates文件夹" class="header-anchor">#</a> 创建templates文件夹</h3> <p>创建templates文件夹，要求和playbook执行的yml文件在同一目录下</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ansible-demo<span class="token punctuation">]</span><span class="token comment"># mkdir templates</span>
<span class="token punctuation">[</span>root@linux101 ansible-demo<span class="token punctuation">]</span><span class="token comment"># cp /etc/nginx/nginx.conf /opt/ansible-demo/templates/nginx.conf.j2</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><h3 id="编辑执行的yml文件"><a href="#编辑执行的yml文件" class="header-anchor">#</a> 编辑执行的yml文件</h3> <p>创建nginx-deploy.yml文件，如果nginx.conf.j2没有放在相对路径的templates目录下，那么src需要配置绝对路径</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ansible-demo<span class="token punctuation">]</span><span class="token comment"># cat nginx-deploy.yml </span>
- hosts: app
  remote_user: root

  tasks:
    - name: <span class="token function">install</span> package
      yum: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx
    - name: copy template
      template: <span class="token assign-left variable">src</span><span class="token operator">=</span>nginx.conf.j2 <span class="token assign-left variable">dest</span><span class="token operator">=</span>/etc/nginx/nginx.conf
    - name: start <span class="token function">service</span>
      service: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx <span class="token assign-left variable">state</span><span class="token operator">=</span>started <span class="token assign-left variable">enabled</span><span class="token operator">=</span>yes <span class="token comment"># enabled yes表示开机启动</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br></div></div><h3 id="执行安装"><a href="#执行安装" class="header-anchor">#</a> 执行安装</h3> <p>执行检查playbook.yml文件命令</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible-playbook -C nginx-deploy.yml
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>执行</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible-playbook nginx-deploy.yml
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="检查安装结果"><a href="#检查安装结果" class="header-anchor">#</a> 检查安装结果</h3> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible app -m shell -a <span class="token string">'rpm -q nginx'</span>
ansible app -m shell -a <span class="token string">'ss -ntpl'</span> <span class="token comment">#查看端口以及进程</span>
ansible app -m shell -a <span class="token string">'ps aux | grep nginx'</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="新需求-nginx-work进程是服务器内核数的一半"><a href="#新需求-nginx-work进程是服务器内核数的一半" class="header-anchor">#</a> 新需求：nginx work进程是服务器内核数的一半</h3> <p>通过setup模块找到cpu的个数，查看属性 <code>ansible_processor_vcpus</code></p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ansible-demo<span class="token punctuation">]</span><span class="token comment"># ansible app -m setup | grep 'processor'</span>
        <span class="token string">&quot;ansible_processor&quot;</span><span class="token builtin class-name">:</span> <span class="token punctuation">[</span>
        <span class="token string">&quot;ansible_processor_cores&quot;</span><span class="token builtin class-name">:</span> <span class="token number">8</span>, 
        <span class="token string">&quot;ansible_processor_count&quot;</span><span class="token builtin class-name">:</span> <span class="token number">2</span>, 
        <span class="token string">&quot;ansible_processor_threads_per_core&quot;</span><span class="token builtin class-name">:</span> <span class="token number">1</span>, 
        <span class="token string">&quot;ansible_processor_vcpus&quot;</span><span class="token builtin class-name">:</span> <span class="token number">16</span>, 
        <span class="token punctuation">..</span>.
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>编辑nginx.confi.j2
注意：需要使用<code>//</code> 整除，得到整数，如果使用 <code>/</code> 则获得的是浮点数，会导致nginx的配置文件出错</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 templates<span class="token punctuation">]</span><span class="token comment"># cat nginx.conf.j2 </span>
<span class="token punctuation">..</span>.
user nginx<span class="token punctuation">;</span>
worker_processes <span class="token punctuation">{</span><span class="token punctuation">{</span> ansible_processor_vcpus//2 <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">..</span>.
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>修改playbook，添加handler，在修改配置文件后，notify重启服务，编辑nginx-deploy.yml文件</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ansible-demo<span class="token punctuation">]</span><span class="token comment"># cat  nginx-deploy.yml </span>
- hosts: app
  remote_user: root

  tasks:
    - name: <span class="token function">install</span> package
      yum: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx
    - name: copy template
      template: <span class="token assign-left variable">src</span><span class="token operator">=</span>nginx.conf.j2 <span class="token assign-left variable">dest</span><span class="token operator">=</span>/etc/nginx/nginx.conf    
      notify: restart <span class="token function">service</span>
    - name: start <span class="token function">service</span>
      service: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx <span class="token assign-left variable">state</span><span class="token operator">=</span>started <span class="token assign-left variable">enabled</span><span class="token operator">=</span>yes
  
  handlers:
    - name: restart <span class="token function">service</span>
      service: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx <span class="token assign-left variable">state</span><span class="token operator">=</span>restarted
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div><p>重新执行</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux101 ansible-demo<span class="token punctuation">]</span><span class="token comment"># ansible-playbook nginx-deploy.yml</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>查看进程数量</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible app -m shell -a <span class="token string">'ps aux|grep nginx'</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><h3 id="新需求-使用自定义变量设置端口号"><a href="#新需求-使用自定义变量设置端口号" class="header-anchor">#</a> 新需求：使用自定义变量设置端口号</h3> <p>在主机清单中给不同的机器设置不同的端口号，作为nginx访问使用的端口号
编辑/etc/ansible/hosts中添加端口号</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>app<span class="token punctuation">]</span>
<span class="token number">192.168</span>.10.102 <span class="token assign-left variable">http_port</span><span class="token operator">=</span><span class="token number">8081</span>
<span class="token number">192.168</span>.10.103 <span class="token assign-left variable">http_port</span><span class="token operator">=</span><span class="token number">8082</span>
<span class="token number">192.168</span>.10.104 <span class="token assign-left variable">http_port</span><span class="token operator">=</span><span class="token number">8083</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>在templates/nignx.conf.j2中使用http_port变量</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>user nginx<span class="token punctuation">;</span>
worker_processes <span class="token punctuation">{</span><span class="token punctuation">{</span> ansible_processor_vcpus//2 <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">..</span>.
http <span class="token punctuation">{</span>
   <span class="token punctuation">..</span>.
    server <span class="token punctuation">{</span>
        listen       <span class="token punctuation">{</span><span class="token punctuation">{</span> http_port  <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment"># 配置http_port</span>
        listen       <span class="token punctuation">[</span>::<span class="token punctuation">]</span>:<span class="token punctuation">{</span><span class="token punctuation">{</span> http_port  <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        server_name  _<span class="token punctuation">;</span>
        root         /usr/share/nginx/html<span class="token punctuation">;</span>
   <span class="token punctuation">..</span>.
    <span class="token punctuation">}</span>

<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p>执行命令</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible-playbook nginx-deploy.yml
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>注意：如果nginx出现了 bind() to 0.0.0.0:8082 failed (13: Permission denied)，那么需要关闭selinux，临时方式如下
如果需要永久关闭selinux，请编辑/etc/selinux/config文件，将SELINUX=disabled。之后将系统重启一下即可</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">[</span>root@linux103 nginx<span class="token punctuation">]</span><span class="token comment"># getenforce</span>
Enforcing
<span class="token punctuation">[</span>root@linux103 nginx<span class="token punctuation">]</span><span class="token comment"># setenforce 0</span>
<span class="token punctuation">[</span>root@linux103 nginx<span class="token punctuation">]</span><span class="token comment"># getenforce</span>
Permissive
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>查看执行结果</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>ansible app -m shell -a <span class="token string">'ss -ntpl'</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><p>如果在nginx-deploy.yml中定义变量，那么playbook的执行配置文件中优先级最高</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>- hosts: app
  remote_user: root
  vars:
    - http_port: <span class="token number">8088</span>

  tasks:
    - name: <span class="token function">install</span> package
      yum: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx
    - name: copy template
      template: <span class="token assign-left variable">src</span><span class="token operator">=</span>nginx.conf.j2 <span class="token assign-left variable">dest</span><span class="token operator">=</span>/etc/nginx/nginx.conf    
      notify: restart <span class="token function">service</span>
    - name: start <span class="token function">service</span>
      service: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx <span class="token assign-left variable">state</span><span class="token operator">=</span>started <span class="token assign-left variable">enabled</span><span class="token operator">=</span>yes
  
  handlers:
    - name: restart <span class="token function">service</span>
      service: <span class="token assign-left variable">name</span><span class="token operator">=</span>nginx <span class="token assign-left variable">state</span><span class="token operator">=</span>restarted
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br></div></div><p>在playbook的template中，针对模板文件，以.j2结尾的文件中使用</p> <h2 id="template中使用for"><a href="#template中使用for" class="header-anchor">#</a> template中使用for</h2> <p>语法 <code>{% for item in vars %} xxx {% endfor %}</code></p> <h3 id="键值对"><a href="#键值对" class="header-anchor">#</a> 键值对</h3> <p>定义变量</p> <div class="language-yaml line-numbers-mode"><pre class="language-yaml"><code><span class="token punctuation">-</span> <span class="token key atrule">hosts</span><span class="token punctuation">:</span> app
  <span class="token key atrule">remote_user</span><span class="token punctuation">:</span> root
  <span class="token key atrule">vars</span><span class="token punctuation">:</span>
    <span class="token key atrule">nginx_vhosts</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token key atrule">listen</span><span class="token punctuation">:</span> <span class="token number">8080</span>  <span class="token comment">#列表 键值对</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>在templates/nginx.conf.j2文件中使用</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">{</span>% <span class="token keyword">for</span> <span class="token for-or-select variable">vh</span> <span class="token keyword">in</span> nginx_vhosts %<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>    <span class="token comment">#重复执行server代码</span>
listen <span class="token punctuation">{</span><span class="token punctuation">{</span> vh.listen <span class="token operator">|</span> default<span class="token punctuation">(</span><span class="token string">'80 default_server'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token punctuation">..</span>.
<span class="token punctuation">}</span>
<span class="token punctuation">{</span>% endfor %<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>生成结果</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>server <span class="token punctuation">{</span>
  listen <span class="token number">8080</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="列表"><a href="#列表" class="header-anchor">#</a> 列表</h3> <p>定义变量</p> <div class="language-yaml line-numbers-mode"><pre class="language-yaml"><code><span class="token punctuation">-</span> <span class="token key atrule">hosts</span><span class="token punctuation">:</span> mageduweb
  <span class="token key atrule">remote_user</span><span class="token punctuation">:</span> root
  <span class="token key atrule">vars</span><span class="token punctuation">:</span>
    <span class="token key atrule">nginx_vhosts</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> web1
      <span class="token punctuation">-</span> web2
      <span class="token punctuation">-</span> web3
  <span class="token key atrule">tasks</span><span class="token punctuation">:</span>
    <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> template config
      <span class="token key atrule">template</span><span class="token punctuation">:</span> src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div><p>在templates/nginx.conf.j2文件中使用列表变量</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">{</span>% <span class="token keyword">for</span> <span class="token for-or-select variable">vh</span> <span class="token keyword">in</span> nginx_vhosts %<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
    listen <span class="token punctuation">{</span><span class="token punctuation">{</span> vh <span class="token punctuation">}</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">{</span>% endfor %<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>生成结果</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>server <span class="token punctuation">{</span>
    listen web1
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
    listen web2
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
    listen web3
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><h2 id="template中使用if"><a href="#template中使用if" class="header-anchor">#</a> template中使用if</h2> <p>语法 <code>{% if 判断条件 %} xxx {% endif %}</code></p> <p>定义变量</p> <div class="language-yaml line-numbers-mode"><pre class="language-yaml"><code><span class="token punctuation">-</span> <span class="token key atrule">hosts</span><span class="token punctuation">:</span> app
  <span class="token key atrule">remote_user</span><span class="token punctuation">:</span> root
  <span class="token key atrule">vars</span><span class="token punctuation">:</span>
    <span class="token key atrule">nginx_vhosts</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token key atrule">listen</span><span class="token punctuation">:</span> <span class="token number">8080</span>  <span class="token comment">#列表 键值对</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>使用变量</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">{</span>% <span class="token keyword">for</span> <span class="token for-or-select variable">vh</span> <span class="token keyword">in</span> nginx_vhosts %<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>    <span class="token comment">#重复执行server代码</span>
    listen <span class="token punctuation">{</span><span class="token punctuation">{</span> vhost.listen <span class="token operator">|</span> default<span class="token punctuation">(</span><span class="token string">'80 default_server'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>

    <span class="token punctuation">{</span>% <span class="token keyword">if</span> vh.server_name is defined %<span class="token punctuation">}</span>
    server_name <span class="token punctuation">{</span><span class="token punctuation">{</span> vhost.server_name <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">{</span>% endif %<span class="token punctuation">}</span>

    <span class="token punctuation">{</span>% <span class="token keyword">if</span> vh.root is defined %<span class="token punctuation">}</span>
    root <span class="token punctuation">{</span><span class="token punctuation">{</span> vhost.root <span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    <span class="token punctuation">{</span>% endif %<span class="token punctuation">}</span>

<span class="token punctuation">}</span>
<span class="token punctuation">{</span>% endfor %<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><h2 id="应用实例-使用for与if"><a href="#应用实例-使用for与if" class="header-anchor">#</a> 应用实例：使用for与if</h2> <p>编写playbook的执行yaml文件，app.yaml</p> <div class="language-yaml line-numbers-mode"><pre class="language-yaml"><code><span class="token punctuation">-</span> <span class="token key atrule">hosts</span><span class="token punctuation">:</span> app
  <span class="token key atrule">remote_user</span><span class="token punctuation">:</span> root
  <span class="token key atrule">vars</span><span class="token punctuation">:</span>
    <span class="token key atrule">nginx_vhosts</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token key atrule">web1</span><span class="token punctuation">:</span>
        <span class="token key atrule">listen</span><span class="token punctuation">:</span> <span class="token number">8080</span>
        <span class="token key atrule">root</span><span class="token punctuation">:</span> <span class="token string">'/var/www/stt/web1'</span>
      <span class="token punctuation">-</span> <span class="token key atrule">web2</span><span class="token punctuation">:</span>
        <span class="token key atrule">listen</span><span class="token punctuation">:</span> <span class="token number">8080</span>
        <span class="token key atrule">server_name</span><span class="token punctuation">:</span> web2.stt.com
        <span class="token key atrule">root</span><span class="token punctuation">:</span> <span class="token string">'/var/www/stt/web2'</span>   
      <span class="token punctuation">-</span> <span class="token key atrule">web3</span><span class="token punctuation">:</span>
        <span class="token key atrule">listen</span><span class="token punctuation">:</span> <span class="token number">8080</span>
        <span class="token key atrule">server_name</span><span class="token punctuation">:</span> web3.stt.com
        <span class="token key atrule">root</span><span class="token punctuation">:</span> <span class="token string">'/var/www/stt/web3'</span>
        
  <span class="token key atrule">tasks</span><span class="token punctuation">:</span>
    <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> template config to
      <span class="token key atrule">template</span><span class="token punctuation">:</span> src=nginx.conf.j2 dest=/etc/nginx/nginx.conf
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br></div></div><p>编写 nginx.conf.j2文件</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code><span class="token punctuation">{</span>% <span class="token keyword">for</span> <span class="token for-or-select variable">vh</span> <span class="token keyword">in</span> nginx_vhosts %<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
 listen <span class="token punctuation">{</span><span class="token punctuation">{</span> vh.listen <span class="token punctuation">}</span><span class="token punctuation">}</span>
 <span class="token punctuation">{</span>% <span class="token keyword">if</span> vh.server_name is defined %<span class="token punctuation">}</span>
 server_name <span class="token punctuation">{</span><span class="token punctuation">{</span> vh.server_name <span class="token punctuation">}</span><span class="token punctuation">}</span>
 <span class="token punctuation">{</span>% endif %<span class="token punctuation">}</span>
 root <span class="token punctuation">{</span><span class="token punctuation">{</span> vh.root <span class="token punctuation">}</span><span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">{</span>% endfor %<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p>生成结果</p> <div class="language-sh line-numbers-mode"><pre class="language-sh"><code>server <span class="token punctuation">{</span>
  listen <span class="token number">8080</span>
  root /var/www/stt/web1/
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
  listen <span class="token number">8080</span>
  server_name: web2.stt.com
  root /var/www/stt/web2/
<span class="token punctuation">}</span>
server <span class="token punctuation">{</span>
  listen <span class="token number">8080</span>
  server_name: web3.stt.com
  root /var/www/stt/web3/
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div></div></div>  <div class="page-edit"><!----> <!----> <div class="last-updated"><span class="prefix">Last Updated:</span> <span class="time">2022/05/22, 12:42:00</span></div></div> <div class="page-nav-wapper"><div class="page-nav-centre-wrap"><a href="/pages/a2e5ec/" class="page-nav-centre page-nav-centre-prev"><div class="tooltip">variables</div></a> <a href="/pages/f12b8f/" class="page-nav-centre page-nav-centre-next"><div class="tooltip">when条件判断</div></a></div> <div class="page-nav"><p class="inner"><span class="prev">
        ←
        <a href="/pages/a2e5ec/" class="prev">variables</a></span> <span class="next"><a href="/pages/f12b8f/">when条件判断</a>→
      </span></p></div></div></div> <!----></main></div> <div class="footer"><div class="icons"><a href="mailto:work_stt@163.com" title="email" target="_blank" class="iconfont icon-youjian"></a><a href="https://github.com/shetengteng" title="GitHub" target="_blank" class="iconfont icon-github"></a></div> 
  Theme by
  <a href="https://github.com/xugaoyi/vuepress-theme-vdoing" target="_blank" title="本站主题">Vdoing</a> 
    | Copyright © 2021-2022
    <span>Shetengteng | MIT License</span></div> <div class="buttons"><div title="返回顶部" class="button blur go-to-top iconfont icon-fanhuidingbu" style="display:none;"></div> <div title="去评论" class="button blur go-to-comment iconfont icon-pinglun" style="display:none;"></div> <div title="主题模式" class="button blur theme-mode-but iconfont icon-zhuti"><ul class="select-box" style="display:none;"><li class="iconfont icon-zidong">
          跟随系统
        </li><li class="iconfont icon-rijianmoshi">
          浅色模式
        </li><li class="iconfont icon-yejianmoshi">
          深色模式
        </li><li class="iconfont icon-yuedu">
          阅读模式
        </li></ul></div></div> <!----> <!----> <!----></div><div class="global-ui"><div></div></div></div>
    <script src="/assets/js/app.ab6a7ec7.js" defer></script><script src="/assets/js/2.bc9beebf.js" defer></script><script src="/assets/js/289.83413eb3.js" defer></script>
  </body>
</html>
